package modelo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import modelo.Juego;


public class Interpol {
	static float CostoTemporalPorOrden=3;
	protected Juego juego;
	
	public Interpol(){
		this.juego = Juego.getInstancia();
	}
	
	public void generarOrdenDeArresto(Policia policia) {
		policia.consumirTiempo(CostoTemporalPorOrden);
		
		List<Ladron> sospechosos = new ArrayList<Ladron>();
		if ( !juego.haTerminado() ){
			
			sospechosos = this.obtenerSospechosos(policia.getSospechoso());
			
			if(sospechosos.size() == 1){
				policia.setOrdenArresto(new OrdenDeArresto(sospechosos.get(0)));
			}
		}
	}
	
	private List<Ladron> obtenerSospechosos(Sospechoso rasgosSospechoso) {
		
		List<Ladron> coincidencias= Juego.getInstancia().getSospechosos();
		coincidencias=this.filtrarPor(rasgosSospechoso.getSexo(), coincidencias);
		coincidencias=this.filtrarPor(rasgosSospechoso.getCabello(), coincidencias);
		coincidencias=this.filtrarPor(rasgosSospechoso.getSenia(), coincidencias);
		coincidencias=this.filtrarPor(rasgosSospechoso.getHobby(), coincidencias);
		coincidencias=this.filtrarPor(rasgosSospechoso.getVehiculo(), coincidencias);
		return coincidencias;
	}
		
	private List<Ladron> filtrarPor(Rasgos.Sexo sexo, List<Ladron> sospechosos){
		
		List<Ladron> coincidencias=new ArrayList<Ladron>();
		
		if(sexo==Rasgos.Sexo.Desconocido){
			return sospechosos;
			
		}
		else {
			Iterator<Ladron> itLadron = sospechosos.iterator();
			while (itLadron.hasNext()){
				Ladron unSospechoso = itLadron.next();
				if (unSospechoso.getSexo()==sexo){
					coincidencias.add(unSospechoso);
				}			
			}
		return coincidencias;
		}
	}

	private List<Ladron> filtrarPor(Rasgos.Cabello cabello, List<Ladron> sospechosos){
		
		List<Ladron> coincidencias=new ArrayList<Ladron>();
		
		if(cabello==Rasgos.Cabello.Desconocido){
			return sospechosos;
			
		}
		else {
			Iterator<Ladron> itLadron = sospechosos.iterator();
			while (itLadron.hasNext()){
				Ladron unSospechoso = itLadron.next();
				if (unSospechoso.getCabello()==cabello){
					coincidencias.add(unSospechoso);
				}			
			}
		return coincidencias;
		}
	}

	private List<Ladron> filtrarPor(Rasgos.Senia senia, List<Ladron> sospechosos){
	
	List<Ladron> coincidencias=new ArrayList<Ladron>();
	
	if(senia==Rasgos.Senia.Desconocida){
		return sospechosos;
		
	}
	else {
		Iterator<Ladron> itLadron = sospechosos.iterator();
		while (itLadron.hasNext()){
			Ladron unSospechoso = itLadron.next();
			if (unSospechoso.getSenia()==senia){
				coincidencias.add(unSospechoso);
			}			
		}
	return coincidencias;
	}
}

	private List<Ladron> filtrarPor(Rasgos.Hobby hobby, List<Ladron> sospechosos){
	
	List<Ladron> coincidencias=new ArrayList<Ladron>();
	
		if(hobby==Rasgos.Hobby.Desconocido){
		return sospechosos;
		
		}
		else {
			Iterator<Ladron> itLadron = sospechosos.iterator();
			while (itLadron.hasNext()){
				Ladron unSospechoso = itLadron.next();
				if (unSospechoso.getHobby()==hobby){
					coincidencias.add(unSospechoso);
				}			
			}
			return coincidencias;
		}
	}

	private List<Ladron> filtrarPor(Rasgos.Vehiculo vehiculo, List<Ladron> sospechosos){
		
		List<Ladron> coincidencias=new ArrayList<Ladron>();
		
		if(vehiculo==Rasgos.Vehiculo.Desconocido){
			return sospechosos;
			
		}
		else {
			Iterator<Ladron> itLadron = sospechosos.iterator();
			while (itLadron.hasNext()){
				Ladron unSospechoso = itLadron.next();
				if (unSospechoso.getVehiculo()==vehiculo){
					coincidencias.add(unSospechoso);
				}			
			}
		return coincidencias;
		}
	}

    public List<Ladron> obtenerSospechosos(Policia policia){
    	this.generarOrdenDeArresto(policia);
        
        List<Ladron> sospechosos = new ArrayList<Ladron>();
        if ( !juego.haTerminado() ){
                
                sospechosos = this.obtenerSospechosos(policia.getSospechoso());

        }
        return sospechosos;        
}
}
